import axios from 'axios'
import router from "@/router";
import {serverIp} from "../../public/config";

import { CacheUtils } from './cacheUtils.js';
import qs from 'qs'

const request = axios.create({
    baseURL: `http://${serverIp}:9090`,
    timeout: 30000
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token，对请求参数统一加密
request.interceptors.request.use(config => {

    console.log("请求request拦截")
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    let user = localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : null //  获取用户 信息
    if (user) {
        config.headers['token'] = user.token;  // 设置请求后台时候带上这个请求标头  后台进行拦判断 ; 作用:防止用户不登陆就能通过url 访问管理系统的页面
    }
    // 缓存
    console.log(config)
    let cacheKey = config.url;

    const method = config.method.toLowerCase();
    if (method === 'get' && config.params && typeof config.params === 'object') {
        cacheKey += qs.stringify(config.params, { addQueryPrefix: true });
    }

    if (['post', 'put', 'patch'].includes(method) && config.data && typeof config.data === 'object') {
        // config.data = qs.stringify(config.data); // 这里不要乱写
        cacheKey += `_${qs.stringify(config.data, { arrayFormat: 'brackets' })}`;  // 将对象转换成以&拼接的形式
    }

    // 每次发送请求之前将上一个未完成的相同请求进行中断
    CacheUtils.cache[cacheKey] && CacheUtils.clearCache(cacheKey);

    // 将当前请求所对应的取消函数存入缓存
    config.cancelToken = new axios.CancelToken(function executor(c) {
        console.log("缓存c")
        CacheUtils.cache[cacheKey] = c;
    });
    // 临时保存 cacheKey，用于在响应拦截器中清除缓存
    config.cacheKey = cacheKey;


    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(response => {

        if (!!response.config.cacheKey){
            console.log("response delete cacheKey")
            const cacheKey = response.config.cacheKey; // cancel
            delete CacheUtils.cache[cacheKey]; // cancel
        }
        // console.log("响应response拦截",response)
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        // 当权限验证不通过的时候给出提示
        if (res.code === '401') {
            // ElementUI.Message({
            //     message: res.msg,
            //     type: 'error'
            // });
            console.log("状态码401 跳转到登录页面")
            router.push("/login")
        }
        return res;
    },
    error => {

        if (!!error.config.cacheKey){
            console.log("error delete cacheKey")
            const cacheKey = error.config.cacheKey;
            delete CacheUtils.cache[cacheKey];
        }

        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)


export default request

